package v2ch10.tableModel;

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;

/**
 * This program shows how to build a table from a table model.
 *
 * @author Cay Horstmann
 * @version 1.03 2006-05-10
 */
public class InvestmentTable {
	public static void main(String[] args) {
		EventQueue.invokeLater(() ->
		{
			JFrame frame = new InvestmentTableFrame();
			frame.setTitle("InvestmentTable");
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			frame.setVisible(true);
		});
	}
}

/**
 * This frame contains the investment table.
 */
class InvestmentTableFrame extends JFrame {
	public InvestmentTableFrame() {
		TableModel model = new InvestmentTableModel(30, 5, 10);
		JTable table = new JTable(model);
		add(new JScrollPane(table));
		pack();
	}
	
}

/**
 * This table model computes the cell entries each time they are requested. The table contents shows
 * the growth of an investment for a number of years under different interest rates.
 */
class InvestmentTableModel extends AbstractTableModel {
	private static double INITIAL_BALANCE = 100000.0;
	
	private int years;
	private int minRate;
	private int maxRate;
	
	/**
	 * Constructs an investment table model.
	 *
	 * @param y  the number of years
	 * @param r1 the lowest interest rate to tabulate
	 * @param r2 the highest interest rate to tabulate
	 */
	public InvestmentTableModel(int y, int r1, int r2) {
		years = y;
		minRate = r1;
		maxRate = r2;
	}
	
	public int getRowCount() {
		return years;
	}
	
	public int getColumnCount() {
		return maxRate - minRate + 1;
	}
	
	public Object getValueAt(int r, int c) {
		double rate = (c + minRate) / 100.0;
		int nperiods = r;
		double futureBalance = INITIAL_BALANCE * Math.pow(1 + rate, nperiods);
		return String.format("%.2f", futureBalance);
	}
	
	public String getColumnName(int c) {
		return (c + minRate) + "%";
	}
}
